package com.piece.core.framework.support.convert;

import com.piece.core.framework.constant.FrameWorkConstants;
import com.piece.core.framework.enums.sql.SqlOperator;
import com.piece.core.framework.util.collection.ArrayUtil;
import com.piece.core.framework.util.collection.CollectionUtil;
import org.apache.commons.httpclient.util.DateUtil;
import org.apache.commons.lang3.StringUtils;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 类型转换器
 */
public class Convert {
    /**
     * 分隔符
     */
    private static final String SPLIT = FrameWorkConstants.SPLIT_PARAM;

    /**
     * 转换字符串<br>
     * <p>如果值为null，或者转换失败，返回默认值</p>
     *
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static String toStr(Object value, String defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (value instanceof String) {
            return (String) value;
        } else if (value instanceof Boolean) {
            return (boolean) value ? "true" : "false";
        } else if (value instanceof Date) {
            return DateUtil.formatDate((Date) value);
        } else if (value instanceof Iterable) {
            return ArrayUtil.join((Iterable)value, SPLIT);
        } else if (value instanceof Iterator) {
            return ArrayUtil.join((Iterator)value, SPLIT);
        } else if (value instanceof Collection) {
            return CollectionUtil.convertString((Collection)value, SPLIT);
        } else {
            return value.toString();
        }
    }

    /**
     * 转换为字符串
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static String toStr(Object value) {
        return toStr(value, null);
    }

    /**
     * 转换为字符<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Character toChar(Object value, Character defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (value instanceof Character) {
            return (Character) value;
        }

        final String valueStr = toStr(value, null);
        return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0);
    }

    /**
     * 转换为字符<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Character toChar(Object value) {
        return toChar(value, null);
    }

    /**
     * 转换为byte<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Byte toByte(Object value, Byte defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (value instanceof Byte) {
            return (Byte) value;
        }
        if (value instanceof Number) {
            return ((Number) value).byteValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr)) {
            return defaultValue;
        }
        try {
            return Byte.parseByte(valueStr);
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /**
     * 转换为byte<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Byte toByte(Object value) {
        return toByte(value, null);
    }

    /**
     * 转换为Short<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Short toShort(Object value, Short defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (value instanceof Short) {
            return (Short) value;
        }
        if (value instanceof Number) {
            return ((Number) value).shortValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr)) {
            return defaultValue;
        }
        try {
            return Short.parseShort(valueStr.trim());
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /**
     * 转换为Short<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Short toShort(Object value) {
        return toShort(value, null);
    }

    /**
     * 转换为Number<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Number toNumber(Object value, Number defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (value instanceof Number) {
            return (Number) value;
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr)) {
            return defaultValue;
        }
        try {
            return NumberFormat.getInstance().parse(valueStr);
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /**
     * 转换为Number<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Number toNumber(Object value) {
        return toNumber(value, null);
    }

    /**
     * 转换为int<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Integer toInt(Object value, Integer defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (value instanceof Integer) {
            return (Integer) value;
        }
        if (value instanceof Number) {
            return ((Number) value).intValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr)) {
            return defaultValue;
        }
        try {
            return Integer.parseInt(valueStr.trim());
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /**
     * 转换为int<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Integer toInt(Object value) {
        return toInt(value, null);
    }

    /**
     * 转换为long<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Long toLong(Object value, Long defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (value instanceof Long) {
            return (Long) value;
        }
        if (value instanceof Number) {
            return ((Number) value).longValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr)) {
            return defaultValue;
        }
        try {
            // 支持科学计数法
            return new BigDecimal(valueStr.trim()).longValue();
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /**
     * 转换为long<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Long toLong(Object value) {
        return toLong(value, null);
    }

    /**
     * 转换为double<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Double toDouble(Object value, Double defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (value instanceof Double) {
            return (Double) value;
        }
        if (value instanceof Number) {
            return ((Number) value).doubleValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr)) {
            return defaultValue;
        }
        try {
            // 支持科学计数法
            return new BigDecimal(valueStr.trim()).doubleValue();
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /**
     * 转换为double<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Double toDouble(Object value) {
        return toDouble(value, null);
    }

    /**
     * 转换为Float<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Float toFloat(Object value, Float defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (value instanceof Float) {
            return (Float) value;
        }
        if (value instanceof Number) {
            return ((Number) value).floatValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr)) {
            return defaultValue;
        }
        try {
            return Float.parseFloat(valueStr.trim());
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /**
     * 转换为Float<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Float toFloat(Object value) {
        return toFloat(value, null);
    }

    /**
     * 转换为boolean<br>
     * <p>
     * String支持的值为：true、false、yes、ok、no，1,0 <br>
     * 如果值为null，或者转换失败，返回null
     * </p>
     *
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Boolean toBool(Object value, Boolean defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (value instanceof Boolean) {
            return (Boolean) value;
        }
        String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr)) {
            return defaultValue;
        }
        valueStr = valueStr.trim().toLowerCase();
        switch (valueStr) {
            case "true":
            case "1":
            case "yes":
                return true;
            case "false":
            case "no":
            case "0":
                return false;
            default:
                return defaultValue;
        }
    }

    /**
     * 转换为boolean<br>
     * <p>
     * String支持的值为：true、false、yes、ok、no，1,0 <br>
     * 如果值为null，或者转换失败，返回null
     * </p>
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Boolean toBool(Object value) {
        return toBool(value, null);
    }

    /**
     * 转换为Enum对象<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param clazz        Enum的Class
     * @param value        值
     * @param defaultValue 默认值
     * @return Enum
     */
    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value, E defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (clazz.isAssignableFrom(value.getClass())) {
            @SuppressWarnings("unchecked")
            E myE = (E) value;
            return myE;
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr)) {
            return defaultValue;
        }
        try {
            return Enum.valueOf(clazz, valueStr);
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /**
     * 转换为Enum对象<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param clazz Enum的Class
     * @param value 值
     * @return Enum
     */
    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value) {
        return toEnum(clazz, value, null);
    }

    /**
     * 转换为BigInteger<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static BigInteger toBigInteger(Object value, BigInteger defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (value instanceof BigInteger) {
            return (BigInteger) value;
        }
        if (value instanceof Long) {
            return BigInteger.valueOf((Long) value);
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr)) {
            return defaultValue;
        }
        try {
            return new BigInteger(valueStr);
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /**
     * 转换为BigInteger<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static BigInteger toBigInteger(Object value) {
        return toBigInteger(value, null);
    }

    /**
     * 转换为BigDecimal<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (value instanceof BigDecimal) {
            return (BigDecimal) value;
        }
        if (value instanceof Long) {
            return new BigDecimal((Long) value);
        }
        if (value instanceof Double) {
            return new BigDecimal((Double) value);
        }
        if (value instanceof Integer) {
            return new BigDecimal((Integer) value);
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr)) {
            return defaultValue;
        }
        try {
            return new BigDecimal(valueStr);
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /**
     * 转换为BigDecimal<br>
     * <p>如果值为null，或者转换失败，返回null</p>
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static BigDecimal toBigDecimal(Object value) {
        return toBigDecimal(value, null);
    }


    /**
     * 转换为Integer数组,以,分隔
     *
     * @param str 被转换的值
     * @return 结果
     */
    public static Integer[] toIntArray(String str) {
        return toIntArray(SPLIT, str);
    }

    /**
     * 转换为Integer数组
     *
     * @param split 分隔符
     * @param str   被转换的值
     * @return 结果
     */
    public static Integer[] toIntArray(String split, String str) {
        if (StringUtils.isEmpty(str)) {
            return new Integer[]{};
        }
        String[] arr = str.split(split);
        final Integer[] ints = new Integer[arr.length];
        for (int i = 0; i < arr.length; i++) {
            final Integer v = toInt(arr[i], 0);
            ints[i] = v;
        }
        return ints;
    }

    /**
     * 转换为Integer数组,以,分隔
     *
     * @param str 被转换的值
     * @return 结果
     */
    public static List<Integer> toIntList(String str) {
        return toIntList(SPLIT, str);
    }

    /**
     * 转换为Integer数组
     *
     * @param split 分隔符
     * @param str   被转换的值
     * @return 结果
     */
    public static List<Integer> toIntList(String split, String str) {
        if (StringUtils.isEmpty(str)) {
            return new ArrayList<>();
        }
        String[] arr = str.split(split);
        List<Integer> result = new ArrayList<>();
        for (int i = 0; i < arr.length; i++) {
            result.add(toInt(arr[i]));
        }
        return result;
    }

    /**
     * 转换为Long数组,以,分隔
     *
     * @param str 被转换的值
     * @return 结果
     */
    public static Long[] toLongArray(String str) {
        return toLongArray(SPLIT, str);
    }

    /**
     * 转换为Long数组
     *
     * @param split 分隔符
     * @param str   被转换的值
     * @return 结果
     */
    public static Long[] toLongArray(String split, String str) {
        if (StringUtils.isEmpty(str)) {
            return new Long[]{};
        }
        String[] arr = str.split(split);
        final Long[] longs = new Long[arr.length];
        for (int i = 0; i < arr.length; i++) {
            final Long v = toLong(arr[i], null);
            longs[i] = v;
        }
        return longs;
    }

    /**
     * 转换为Long数组,以,分隔
     *
     * @param str 被转换的值
     * @return 结果
     */
    public static List<Long> toLongList(String str) {
        return toLongList(SPLIT, str);
    }

    /**
     * 转换为Long数组
     *
     * @param split 分隔符
     * @param str   被转换的值
     * @return 结果
     */
    public static List<Long> toLongList(String split, String str) {
        if (StringUtils.isEmpty(str)) {
            return new ArrayList<>();
        }
        String[] arr = str.split(split);
        List<Long> result = new ArrayList<>();
        for (int i = 0; i < arr.length; i++) {
            result.add(toLong(arr[i]));
        }
        return result;
    }

    /**
     * 转换为Long数组
     *
     * @param list 被转换的值
     * @return 结果
     */
    public static List<Long> toLongList(List list) {
        if (list.isEmpty()) {
            return new ArrayList<>();
        }
        List<Long> result = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            result.add(toLong(list.get(i)));
        }
        return result;
    }

    /**
     * 转换为String数组,以,分隔
     *
     * @param str 被转换的值
     * @return 结果
     */
    public static String[] toStrArray(String str) {
        return toStrArray(SPLIT, str);
    }

    /**
     * 转换为String数组
     *
     * @param split 分隔符
     * @param split 被转换的值
     * @return 结果
     */
    public static String[] toStrArray(String split, String str) {
        if (null == str) return null;
        return str.split(split);
    }

    /**
     * 转换为String数组,以,分隔
     *
     * @param str 被转换的值
     * @return 结果
     */
    public static List<String> toStrList(String str) {
        return toStrList(str, SPLIT);
    }

    /**
     * 转换为String数组
     *
     * @param str   被转换的值
     * @param split 分隔符
     * @return 结果
     */
    public static List<String> toStrList(String str, String split) {
        if (StringUtils.isEmpty(str)) {
            return new ArrayList<>();
        }
        String[] arr = str.split(split);
        List<String> result = new ArrayList<>();
        for (int i = 0; i < arr.length; i++) {
            result.add(toStr(arr[i]));
        }
        return result;
    }

    /**
     * 将对象转为字符串
     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组
     * 2、对象数组会调用Arrays.toString方法
     *
     * @param obj 对象
     * @return 字符串
     */
    public static String toString(Object obj) {
        return toString(obj, StandardCharsets.UTF_8);
    }

    /**
     * 将对象转为字符串
     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组
     * 2、对象数组会调用Arrays.toString方法
     *
     * @param obj         对象
     * @param charsetName 字符集
     * @return 字符串
     */
    public static String toString(Object obj, String charsetName) {
        return toString(obj, Charset.forName(charsetName));
    }

    /**
     * 将对象转为字符串
     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组
     * 2、对象数组会调用Arrays.toString方法
     *
     * @param obj     对象
     * @param charset 字符集
     * @return 字符串
     */
    public static String toString(Object obj, Charset charset) {
        if (null == obj) {
            return null;
        }

        if (obj instanceof String) {
            return (String) obj;
        } else if (obj instanceof byte[] || obj instanceof Byte[]) {
            return toString(obj, charset);
        } else if (obj instanceof ByteBuffer) {
            return toString((ByteBuffer) obj, charset);
        }
        return obj.toString();
    }

    /**
     * 将byte数组转为字符串
     *
     * @param bytes   byte数组
     * @param charset 字符集
     * @return 字符串
     */
    public static String toString(byte[] bytes, String charset) {
        return toString(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset));
    }

    /**
     * 将byte数组转为各种进制的字符串
     */
    public static String binary(byte[] bytes, int radix) {
        return new BigInteger(1, bytes).toString(radix);
    }

    /**
     * 十六进制转为byte字组
     */
    public static byte[] parseHexToByte(String hexStr) {
        if (hexStr.length() < 1)
            return null;

        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }

    /**
     * 十进制字节数组转十六进制字符串
     */
    public static final String byteToHex(byte[] bytes) {
        StringBuilder stringBuilder = new StringBuilder(bytes.length * 2);
        String hex = "";
        for (byte element : bytes) {
            // 整数转成十六进制表示
            hex = Integer.toHexString(element & 0XFF);
            if (hex.length() == 1) {
                stringBuilder.append("0").append(hex);
            } else {
                stringBuilder.append(hex);
            }
        }
        return stringBuilder.toString();
    }

    /**
     * 十六进制字符串转十进制字节数组
     */
    public static final byte[] hex2byte(String hex) {
        byte[] bytes = hex.getBytes();
        if (bytes.length % 2 != 0) {
            throw new IllegalArgumentException("十六进制字符串长度不是偶数");
        }
        byte[] b = new byte[bytes.length / 2];
        for (int n = 0; n < bytes.length; n += 2) {
            String item = new String(bytes, n, 2);
            // 两位一组，表示一个字节,把这样表示的16进制字符串，还原成一个十进制字节
            b[n / 2] = (byte) Integer.parseInt(item, 16);
        }
        return b;
    }

    /**
     * 解码字节码
     *
     * @param data    字符串
     * @param charset 字符集
     * @return 解码后的字符串
     */
    public static String toString(byte[] data, Charset charset) {
        if (null == data) {
            return null;
        }

        if (null == charset) {
            return new String(data);
        }
        return new String(data, charset);
    }

    /**
     * 将编码的byteBuffer数据转换为字符串
     *
     * @param data    数据
     * @param charset 字符集，如果为空使用当前系统字符集
     * @return 字符串
     */
    public static String toString(ByteBuffer data, String charset) {
        if (null == data) {
            return null;
        }

        return toString(data, Charset.forName(charset));
    }

    /**
     * 将编码的byteBuffer数据转换为字符串
     *
     * @param data    数据
     * @param charset 字符集，如果为空使用当前系统字符集
     * @return 字符串
     */
    public static String toString(ByteBuffer data, Charset charset) {
        if (null == charset) {
            charset = Charset.defaultCharset();
        }
        return charset.decode(data).toString();
    }

    /**
     * 将对象转换成日期
     *
     * @param value
     * @return
     */
    public static Date toDate(Object value) {
        return toDate(value, null);
    }

    /**
     * 将对象转换成日期
     *
     * @param value
     * @param defaultValue 默认值
     * @return
     */
    public static Date toDate(Object value, Date defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (value instanceof Date) {
            return (Date) value;
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr)) {
            return defaultValue;
        }
        try {
            return DateUtil.parseDate(valueStr, Collections.singletonList("yyyy-MM-dd"));
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /**
     * 将对象转换成日期
     *
     * @param value
     * @return
     */
    public static String toDateStr(Object value) {
        return toDateStr(value, null);
    }

    /**
     * 将对象转换成日期
     *
     * @param value
     * @param defaultValue 默认值
     * @return
     */
    public static String toDateStr(Object value, String defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (value instanceof Date) {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return formatter.format((Date) value);
        }
        final String valueStr = toStr(value, null);
        return valueStr;
    }

    /**
     * 将对象转换成日期
     *
     * @param str 转换值
     * @return
     */
    public static Date[] toDateArr(String str) {
        return toDateArr(SPLIT, str);
    }

    /**
     * 将对象转换成日期
     *
     * @param split 分隔符
     * @param str   转换值
     * @return
     */
    public static Date[] toDateArr(String split, String str) {
        if (null == str) {
            return new Date[]{};
        }
        String[] arr = str.split(split);
        final Date[] dates = new Date[arr.length];
        for (int i = 0; i < arr.length; i++) {
            final Date v = toDate(arr[i], new Date());
            dates[i] = v;
        }
        return dates;
    }

    /**
     * 解析转换值
     * <p>例: 0=男,1=女,2=未知</p>
     *
     * @param propertyValue 参数值
     * @param converterExp  翻译注解
     * @return 转换后值
     */
    public static String formatStr(String propertyValue, String converterExp) {
        String[] convertSource = converterExp.split(",");
        StringBuffer result = new StringBuffer();
        for (String item : convertSource) {
            String[] itemArray = item.split("=");
            if (("," + propertyValue + ",").indexOf(itemArray[0]) > -1) {
                result.append(itemArray[1] + ",");
            } else if (("," + propertyValue + ",").indexOf(itemArray[1]) > -1) {
                result.append(itemArray[0] + ",");
            }
        }
        if (result.length() > 0) {
            result.deleteCharAt(result.length() - 1);
        }
        return result.toString();
    }

    /**
     * 半角转全角
     *
     * @param input String.
     * @return 全角字符串.
     */
    public static String toSBC(String input) {
        return toSBC(input, null);
    }

    /**
     * 半角转全角
     *
     * @param input         String
     * @param notConvertSet 不替换的字符集合
     * @return 全角字符串.
     */
    public static String toSBC(String input, Set<Character> notConvertSet) {
        char[] c = input.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if (null != notConvertSet && notConvertSet.contains(c[i])) {
                // 跳过不替换的字符
                continue;
            }

            if (c[i] == ' ') {
                c[i] = '\u3000';
            } else if (c[i] < '\177') {
                c[i] = (char) (c[i] + 65248);

            }
        }
        return new String(c);
    }

    /**
     * 全角转半角
     *
     * @param input String.
     * @return 半角字符串
     */
    public static String toDBC(String input) {
        return toDBC(input, null);
    }

    /**
     * 替换全角为半角
     *
     * @param text          文本
     * @param notConvertSet 不替换的字符集合
     * @return 替换后的字符
     */
    public static String toDBC(String text, Set<Character> notConvertSet) {
        char[] c = text.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if (null != notConvertSet && notConvertSet.contains(c[i])) {
                // 跳过不替换的字符
                continue;
            }

            if (c[i] == '\u3000') {
                c[i] = ' ';
            } else if (c[i] > '\uFF00' && c[i] < '\uFF5F') {
                c[i] = (char) (c[i] - 65248);
            }
        }
        String returnString = new String(c);

        return returnString;
    }

    /**
     * 字符串转map对象
     *
     * @param text 文本,格式[key1=value1,key2=value2]
     */
    public static Map<String, Object> toMap(String text) {
        return toMap(text, ",", "=");
    }

    /**
     * 字符串转map对象
     *
     * @param text      文本
     * @param spilt     分隔符
     * @param separator 属性分隔符
     */
    public static Map<String, Object> toMap(String text, String spilt, String separator) {
        Map<String, Object> result = new HashMap<>();
        if (StringUtils.isEmpty(text)) {
            return result;
        }
        String[] arrs = text.split(spilt);
        for (String arr : arrs) {
            result.put(arr.split(separator)[0], arr.split(separator)[1]);
        }
        return result;
    }

    /**
     * String值类型转换定义类型
     *
     * @param type  转换类型
     *              <small>S:string L:long INT:int DOU:double BD:BigDecimal FL:float SH:short D:date</small>
     * @param value 转换值
     */
    public static Object invert(String type, Object value) {
        if (null == value) {
            return null;
        }
        Object obj = value;
        if ("S".equals(type)) {
            obj = toStr(value);
        } else if ("L".equals(type)) {
            obj = toLong(value);
        } else if ("INT".equals(type)) {
            obj = toInt(value);
        } else if ("DOU".equals(type)) {
            obj = toDouble(value);
        } else if ("BD".equals(type)) {
            obj = toBigDecimal(value);
        } else if ("FT".equals(type)) {
            obj = toFloat(value);
        } else if ("SH".equals(type)) {
            obj = toShort(value);
        } else if ("D".equals(type)) {
            obj = toDate(value);
        } else if ("DS".equals(type)) {
            obj = toDateStr(value);
        } else if ("IN".equals(type)) {
            obj = Arrays.asList(toStrArray(toStr(value)));
        } else {
            obj = value;
        }
        return obj;
    }

    /**
     * 根据字段类型自动转换Object值
     *
     * @param field
     * @param value
     * @return
     */
    public static Object invert(Field field, Object value) {
        if (null == value) {
            return null;
        }
        if (field.getGenericType().toString().equals("class java.lang.String")) {
            // 如果类型是String
            return toStr(value);
        } else if (field.getGenericType().toString().equals("class java.lang.Integer") || field.getGenericType().toString().equals("int")) {
            // 如果类型是Integer
            return toInt(value);
        } else if (field.getGenericType().toString().equals("class java.lang.Short")) {
            // 如果类型是Short
            return toShort(value);
        } else if (field.getGenericType().toString().equals("class java.lang.Double") || field.getGenericType().toString().equals("double")) {
            // 如果类型是Double
            return toDouble(value);
        } else if (field.getGenericType().toString().equals("class java.lang.Long") || field.getGenericType().toString().equals("long")) {
            // 如果类型是Integer
            return toLong(value);
        } else if (field.getGenericType().toString().equals("class java.lang.Boolean") || field.getGenericType().toString().equals("boolean")) {
            // 如果类型是Boolean 是封装类
            return toBool(value);
        } else if (field.getGenericType().toString().equals("class java.util.Date")) {
            // 如果类型是Date
            return toDate(value);
        } else if (field.getGenericType().toString().equals("class java.math.BigDecimal")) {
            // 如果类型是BigDecimal
            return toBigDecimal(value);
        }
        return value;
    }

    /**
     * 查询条件转换
     *
     * @param column         列名
     * @param name           参数名称
     *                       Q_字段名称_类别_条件_关联关系<br>
     *                       Q: 固定查询标识<br>
     *                       字段名称:  属性名称<br>
     *                       类别:  S:string、 L:long、 DOU:double、 INT:int、 BD:BigDecimal、 FL:float、 SH:short、 D:date<br>
     *                       条件:  LT:<、 GT:>、 EQ:=、 LE:<=、 GE:>=、 LK:like、EMP:empty、 NEMP:not empty、
     *                       NULL:null、 NNULL:not null、IN:in、 NIN:not in、 NEQ:!=<br>
     *                       关联关系: AND、OR，默认为AND
     * @param value          参数值
     * @param conditionValue 查询参数集
     * @param alias          别名
     */
    public static String invertFormat(String column, String name, Object value, List<Object> conditionValue, String alias) {
        return invertFormat(column, name, value, conditionValue, alias, true);
    }

    /**
     * 查询条件转换
     *
     * @param column         列名
     * @param name           参数名称
     *                       Q_字段名称_类别_条件_关联关系<br>
     *                       Q: 固定查询标识<br>
     *                       字段名称:  属性名称<br>
     *                       类别:  S:string、 L:long、 DOU:double、 INT:int、 BD:BigDecimal、 FL:float、 SH:short、 D:date<br>
     *                       条件:  LT:<、 GT:>、 EQ:=、 LE:<=、 GE:>=、 LK:like、EMP:empty、 NEMP:not empty、
     *                       NULL:null、 NNULL:not null、IN:in、 NIN:not in、 NEQ:!=<br>
     *                       关联关系: AND、OR，默认为AND
     * @param value          参数值
     * @param conditionValue 查询参数集
     * @param alias          别名
     */
    public static String invertFormat(String column, String name, Object value, List<Object> conditionValue, String alias, boolean usePosition) {
        StringBuffer where = new StringBuffer();
        String type = name.split("_")[3];
        String symbol = null, relation = null;
        symbol = name.split("_")[2];
        String alias_temp = null == alias ? "" : (alias + ".");
        String position = toStr(conditionValue.size(), "");
        if (!usePosition) {
            position = "";
        }

        try {
            relation = name.split("_")[4];
        } catch (Exception e) {
            relation = "AND";
        }
        relation = relation + " ";

        where.append(relation);
        where.append(alias_temp);

        switch (SqlOperator.valueOf(type)) {
            case LT:
                if (null == value) break;
                where.append(column + " < ?" + position + " ");
                if ("D".equals(symbol)) {
                    conditionValue.add(toDate(value));
                } else {
                    conditionValue.add(toNumber(value));
                }
                break;
            case GT:
                if (null == value) break;
                where.append(column + " > ?" + position + " ");
                if ("D".equals(symbol)) {
                    conditionValue.add(toDate(value));
                } else {
                    conditionValue.add(toNumber(value));
                }
                break;
            case LE:
                if (null == value) break;
                where.append(column + " <= ?" + position + " ");
                if ("D".equals(symbol)) {
                    conditionValue.add(toDate(value));
                } else {
                    conditionValue.add(toNumber(value));
                }
                break;
            case GE:
                if (null == value) break;
                where.append(column + " >= ?" + position + " ");
                if ("D".equals(symbol)) {
                    conditionValue.add(toDate(value));
                } else {
                    conditionValue.add(toNumber(value));
                }
                break;
            case LK:
                if (null == value) break;
                where.append(column + " like ?" + position + " ");
                conditionValue.add("%" + toStr(value) + "%");
                break;
            case IN:
                if (null == value) break;
                where.append(column + " in (?" + position + ") ");
                conditionValue.add(generateListValue(symbol, value));
                break;
            case EMP:
                where.append(column + " is empty ");
                break;
            case NEMP:
                where.append(column + " is not empty ");
                break;
            case NULL:
                where.append(column + " is null ");
                break;
            case NNULL:
                where.append(column + " is not null ");
                break;
            case NEQ:
                if (null == value) break;
                where.append(column + " != ?" + position + " ");
                conditionValue.add(invert(symbol, value));
                break;
            case NLK:
                if (null == value) break;
                where.append(column + " not like ?" + position + " ");
                conditionValue.add("%" + toStr(value) + "%");
                break;
            case NIN:
                if (null == value) break;
                where.append(column + " not in (?" + position + ") ");
                conditionValue.add(generateListValue(symbol, value));
                break;
            default:
                if (null == value) break;
                where.append(column + " = ?" + position + " ");
                conditionValue.add(invert(symbol, value));
        }

        return where.toString();
    }

    public static List generateListValue(String symbol, Object value) {
        if (value instanceof List) {
            return (List) value;
        } else {
            if ("INT".equals(symbol)) {
                return Arrays.asList(toIntArray(Convert.toStr(value)));
            } else if ("L".equals(symbol)) {
                return Arrays.asList(toLongArray(Convert.toStr(value)));
            } else {
                return Arrays.asList(Convert.toStrArray(Convert.toStr(value)));
            }
        }
    }
}
